package com.dlyk.service.impl;

import com.alibaba.excel.EasyExcel;
import com.dlyk.config.listener.UploadDataListener;
import com.dlyk.constant.Constants;
import com.dlyk.manager.ClueManager;
import com.dlyk.mapper.ClueMapper;
import com.dlyk.model.*;
import com.dlyk.query.BaseQuery;
import com.dlyk.query.ClueQuery;
import com.dlyk.service.ClueService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import org.springframework.beans.BeanUtils;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.*;

@Service
public class ClueServiceImpl implements ClueService {

    @Resource
    private ClueMapper clueMapper;

    @Resource
    private ClueManager clueManager;

    /**
     * 获取线索列表（PageHelper分页查询）
     */
    @Override
    public PageInfo<Clue> getClueListByPage(Integer current) {

        // 1、设置PageHelper
        PageHelper.startPage(current, Constants.PAGE_SIZE);

        // 2、查询（传入一个BaseQuery类，用于拼接sql语句）
        List<Clue> clueList = clueMapper.selectClueListByPage(BaseQuery.builder().build());

        // 3、封装分页数据到PageInfo
        PageInfo<Clue> cluePageInfo = new PageInfo<>(clueList);

        return cluePageInfo;
    }

    /**
     * 导入线索Excel
     */
    @Override
    public void clueImportExcel(MultipartFile file) throws IOException {

        // 参数1：要读取Excel文件的输入流
        // 参数2：Excel模板类（Excel所对应的类。注意：在Excel中出现的字段需要使用@ExcelProperty注解指定字段名和转换器。使用@ExcelIgnoreUnannotated注解忽略没有使用@ExcelProperty注解的字段，使其不参与Excel的读写）
        // 参数3：上传数据监听器（文件读取监听器）
        EasyExcel.read(file.getInputStream(), Clue.class, new UploadDataListener(clueMapper))
                 .sheet()
                 .doRead();
    }

    /**
     * 加载下拉选项
     */
    @Override
    public Map<String, Object> getClueOptions() {

        // 调用 通用业务处理层（Manager层）
        return clueManager.getClueOptions();
    }

    /**
     * 验证手机号是否录入过
     */
    @Override
    public int getCountByPhone(String phone) {
        return clueMapper.selectCountByPhone(phone);
    }

    /**
     * 录入线索
     */
    @Override
    public int saveClue(ClueQuery clueQuery) {

        Clue clue = new Clue();

        // 使用BeanUtils工具将ClueQuery对象的属性值复制到Clue对象
        BeanUtils.copyProperties(clueQuery, clue);

        // 设置创建时间
        clue.setCreateTime(new Date());
        // 设置创建者（录入线索的时候负责人是固定的，就是当前登录用户，所以这里的负责人就是创建者）
        clue.setCreateBy(clue.getOwnerId());

        return clueMapper.insertSelective(clue);
    }

    /**
     * 根据id查询线索
     */
    @Override
    public Clue getClueById(Integer id) {
        return clueMapper.selectByPrimaryKey(id);
    }

    /**
     * 编辑线索
     */
    @Override
    public int editClue(ClueQuery clueQuery) {

        Clue clue = new Clue();

        // 使用BeanUtils工具将ClueQuery对象的属性值复制到Clue对象
        BeanUtils.copyProperties(clueQuery, clue);

        // 获取编辑者（当前登录用户就是编辑者）
        User loginUser = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();

        // 设置编辑时间
        clue.setEditTime(new Date());
        // 设置编辑者
        clue.setEditBy(loginUser.getId());

        return clueMapper.updateByPrimaryKeySelective(clue);
    }

    /**
     * 加载线索详情
     */
    @Override
    public Clue getClueDetailById(Integer id) {
        return clueMapper.selectClueDetailById(id);
    }

    /**
     * 删除线索
     */
    @Override
    public int removeClueById(Integer id) {
        return clueMapper.deleteByPrimaryKey(id);
    }

    /**
     * 批量删除线索
     */
    @Override
    public int batchRemoveClueByIds(List<String> ids) {
        return clueMapper.deleteClueByIds(ids);
    }

}

